package administracion;

import java.rmi.RemoteException;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import dao.AdministracionDAO;
import dto.Administracion.DTO_Destino;
import dto.Administracion.DTO_DestinoNacional;
import dto.Administracion.DTO_DestinoInternacional;
import dto.Administracion.DTO_Empleado;
import dto.Administracion.DTO_Pais;
import dto.Administracion.DTO_Provincia;
import dto.Administracion.DTO_Rol;
import dto.Administracion.DTO_Stock;
import dto.Administracion.DTO_Sucursal;
import dto.Administracion.DTO_Usuario;
import entity.Administracion.Entity_Destino;
import entity.Administracion.Entity_DestinoInternacional;
import entity.Administracion.Entity_DestinoNacional;
import entity.Administracion.Entity_Empleado;
import entity.Administracion.Entity_Pais;
import entity.Administracion.Entity_Provincia;
import entity.Administracion.Entity_Rol;
import entity.Administracion.Entity_Stock;
import entity.Administracion.Entity_Sucursal;
import entity.Administracion.Entity_Usuario;



public class Gestor_Administracion {
	private static Gestor_Administracion instancia;
	
	private Gestor_Administracion(){
		
	}
	
	public static Gestor_Administracion getInstancia(){
		if(instancia == null){
			instancia = new Gestor_Administracion();
		} 
		return instancia;
	}
	/*********************************************************************************************************************************/
	/**Empleados**/
	public void altaEmpleado(DTO_Empleado empleado) {
		Entity_Sucursal suc = AdministracionDAO.getInstancia().getSucursal(empleado.getIdSucursal());
		Entity_Empleado sup = AdministracionDAO.getInstancia().getEmpleado(empleado.getIdSucursal());

		Entity_Empleado e = new Entity_Empleado();
		e.setNombre(empleado.getNombre());
		e.setApellido(empleado.getApellido());
		e.setFechaIngreso(empleado.getFechaIngreso());
		e.setFechaEgreso(empleado.getFechaEgreso());
		e.setSuperior(sup);
		e.setSucursal(suc);
		AdministracionDAO.getInstancia().altaEmpleado(e);
	}
	public void modificarEmpleado(DTO_Empleado empleado) {
		Entity_Sucursal suc = AdministracionDAO.getInstancia().getSucursal(empleado.getIdSucursal());
		Entity_Empleado sup = AdministracionDAO.getInstancia().getEmpleado(empleado.getIdSucursal());

		Entity_Empleado e = new Entity_Empleado();
		e.setId(empleado.getId());
		e.setNombre(empleado.getNombre());
		e.setApellido(empleado.getApellido());
		e.setFechaIngreso(empleado.getFechaIngreso());
		e.setFechaEgreso(empleado.getFechaEgreso());
		e.setSuperior(sup);
		e.setSucursal(suc);
		
		AdministracionDAO.getInstancia().modificarEmpleado(e);
	}
	public void bajaEmpleado(Integer idEmpleado) {
		Entity_Empleado e = AdministracionDAO.getInstancia().getEmpleado(idEmpleado);
		if (e != null)
			AdministracionDAO.getInstancia().modificarEmpleado(e);
	}
	public DTO_Empleado getEmpleado(Integer idEmpleado)  {
		return AdministracionDAO.getInstancia().getEmpleado(idEmpleado).toDTO();
	}
	
	/*********************************************************************************************************************************/
	/**Sucursal**/
	public void altaSucursal(DTO_Sucursal sucursal) throws RemoteException {
		Entity_Empleado gerente = AdministracionDAO.getInstancia().getEmpleado(sucursal.getIdGerente());
		Entity_Empleado encargadoDeposito = AdministracionDAO.getInstancia().getEmpleado(sucursal.getIdEncargadoDeposito());
		Entity_Empleado recepcionPedidos = AdministracionDAO.getInstancia().getEmpleado(sucursal.getIdRecepcionPedidos());

		Entity_Sucursal s = new Entity_Sucursal();
		s.setDescripcion(sucursal.getDescripcion());
		s.setProvincia(sucursal.getProvincia());
		s.setLocalidad(sucursal.getLocalidad());
		s.setDireccion(sucursal.getDireccion());
		s.setCodigoPostal(sucursal.getCodigoPostal());
		s.setTelefono(sucursal.getTelefono());
		s.setCostoLocal(sucursal.getCostoLocal());
		s.setGerente(gerente);
		s.setEncargadoDeposito(encargadoDeposito);
		s.setRecepcionPedidos(recepcionPedidos);
		AdministracionDAO.getInstancia().altaSucursal(s);
	}

	public void modificarSucursal(DTO_Sucursal sucursal) throws RemoteException {
		Entity_Empleado gerente = AdministracionDAO.getInstancia().getEmpleado(sucursal.getIdGerente());
		Entity_Empleado encargadoDeposito = AdministracionDAO.getInstancia().getEmpleado(sucursal.getIdEncargadoDeposito());
		Entity_Empleado recepcionPedidos = AdministracionDAO.getInstancia().getEmpleado(sucursal.getIdRecepcionPedidos());

		Entity_Sucursal s = new Entity_Sucursal();
		s.setId(sucursal.getId());
		s.setDescripcion(sucursal.getDescripcion());
		s.setProvincia(sucursal.getProvincia());
		s.setLocalidad(sucursal.getLocalidad());
		s.setDireccion(sucursal.getDireccion());
		s.setCodigoPostal(sucursal.getCodigoPostal());
		s.setTelefono(sucursal.getTelefono());
		s.setCostoLocal(sucursal.getCostoLocal());
		s.setGerente(gerente);
		s.setEncargadoDeposito(encargadoDeposito);
		s.setRecepcionPedidos(recepcionPedidos);
		
		AdministracionDAO.getInstancia().modificarSucursal(s);
	}

	public void bajaSucursal(Integer idSucursal) throws RemoteException {
		Entity_Sucursal s = AdministracionDAO.getInstancia().getSucursal(idSucursal);
		if (s != null)
			AdministracionDAO.getInstancia().bajaSucursal(s);
	}

	public DTO_Sucursal getSucursal(Integer idSucursal) throws RemoteException {
		 return AdministracionDAO.getInstancia().getSucursal(idSucursal).toDTO();
	}
	/*********************************************************************************************************************************/
	/**Stock**/
	
	public void altaStock(DTO_Stock stock){
		Entity_Sucursal sucursal = AdministracionDAO.getInstancia().getSucursal(stock.getIdSucursal());
		Entity_Stock s = new Entity_Stock();
		s.setDescripcion(stock.getDescripcion());
		s.setSucursal(sucursal);
		AdministracionDAO.getInstancia().altaStock(s);
	}
	
	public void modificarStock(DTO_Stock stock){
		Entity_Sucursal sucursal = AdministracionDAO.getInstancia().getSucursal(stock.getIdSucursal());
		Entity_Stock s = new Entity_Stock();
		s.setId(stock.getId());
		s.setDescripcion(stock.getDescripcion());
		s.setSucursal(sucursal);
		AdministracionDAO.getInstancia().modificarStock(s);
	}

	public void bajaStock(Integer idStock){
		Entity_Stock s = AdministracionDAO.getInstancia().getStock(idStock);
		if (s != null)
			AdministracionDAO.getInstancia().bajaStock(s);
	}

	public DTO_Stock getStock(Integer idStock){
		return AdministracionDAO.getInstancia().getStock(idStock).toDTO();
	}
	
	/*********************************************************************************************************************************/
	/**Destino**/
	public void altaDestino(DTO_Destino destino) {
		 Entity_Destino d = null;
		 Entity_Sucursal sucursalOrigen = AdministracionDAO.getInstancia().getSucursal(destino.getIdSucursalOrigen());
		 if (destino instanceof DTO_DestinoNacional){
			 d = new Entity_DestinoNacional();
			 d.setSucursalOrigen(sucursalOrigen);
			 d.setCiudad(destino.getCiudad());
			 d.setDistanciaKM(destino.getDistanciaKM());
			 d.setCostoFijo(destino.getCostoFijo());
			 d.setDiasViaje(destino.getDiasViaje());
			 d.setGanancia(destino.getGanancia());
			 d.setCostoKMExtra(destino.getCostoKMExtra());
			 ((Entity_DestinoNacional) d).setProvincia(((DTO_DestinoNacional) destino).getProvincia());
			 
			 ((Entity_DestinoNacional) d).setProvincia(((DTO_DestinoNacional) destino).getProvincia());
			 Entity_Sucursal sucursalProxima = AdministracionDAO.getInstancia().getSucursal(((DTO_DestinoNacional) destino).getIdSucursalProxima());
			 ((Entity_DestinoNacional) d).setSucursalProxima(sucursalProxima);
			 ((Entity_DestinoNacional) d).setCamino(((DTO_DestinoNacional) destino).getCamino());
			 
			 AdministracionDAO.getInstancia().altaDestinoNacional((Entity_DestinoNacional) d);
		 } else {
			 d = new Entity_DestinoInternacional();
			 d.setSucursalOrigen(sucursalOrigen);
			 d.setCiudad(destino.getCiudad());
			 d.setDistanciaKM(destino.getDistanciaKM());
			 d.setCostoFijo(destino.getCostoFijo());
			 d.setDiasViaje(destino.getDiasViaje());
			 d.setGanancia(destino.getGanancia());
			 d.setCostoKMExtra(destino.getCostoKMExtra());
			 ((Entity_DestinoInternacional) d).setPais(((DTO_DestinoInternacional) destino).getPais()); 
			 
			 AdministracionDAO.getInstancia().altaDestinoInternacional((Entity_DestinoInternacional) d);
		 }
	}

	public void modificarDestino(DTO_Destino destino){
		 Entity_Destino d = null;
		 Entity_Sucursal sucursalOrigen = AdministracionDAO.getInstancia().getSucursal(destino.getIdSucursalOrigen());
		 if (destino instanceof DTO_DestinoNacional){
			 d = new Entity_DestinoNacional();
			 d.setId(destino.getId());
			 d.setSucursalOrigen(sucursalOrigen);
			 d.setCiudad(destino.getCiudad());
			 d.setDistanciaKM(destino.getDistanciaKM());
			 d.setCostoFijo(destino.getCostoFijo());
			 d.setDiasViaje(destino.getDiasViaje());
			 d.setGanancia(destino.getGanancia());
			 d.setCostoKMExtra(destino.getCostoKMExtra());
			 ((Entity_DestinoNacional) d).setProvincia(((DTO_DestinoNacional) destino).getProvincia());
			 
			 ((Entity_DestinoNacional) d).setProvincia(((DTO_DestinoNacional) destino).getProvincia());
			 Entity_Sucursal sucursalProxima = AdministracionDAO.getInstancia().getSucursal(((DTO_DestinoNacional) destino).getIdSucursalProxima());
			 ((Entity_DestinoNacional) d).setSucursalProxima(sucursalProxima);
			 ((Entity_DestinoNacional) d).setCamino(((DTO_DestinoNacional) destino).getCamino());
			 
			 AdministracionDAO.getInstancia().modificarDestinoNacional((Entity_DestinoNacional) d);
		 } else {
			 d = new Entity_DestinoInternacional();
			 d.setId(destino.getId());
			 d.setSucursalOrigen(sucursalOrigen);
			 d.setCiudad(destino.getCiudad());
			 d.setDistanciaKM(destino.getDistanciaKM());
			 d.setCostoFijo(destino.getCostoFijo());
			 d.setDiasViaje(destino.getDiasViaje());
			 d.setGanancia(destino.getGanancia());
			 d.setCostoKMExtra(destino.getCostoKMExtra());
			 ((Entity_DestinoInternacional) d).setPais(((DTO_DestinoInternacional) destino).getPais()); 
			 
			 AdministracionDAO.getInstancia().modificarDestinoInternacional((Entity_DestinoInternacional) d);
		 }
	}

	public void bajaDestino(Integer idDestino) {
			Entity_DestinoNacional dn = AdministracionDAO.getInstancia().getDestinoNacional(idDestino);
			if (dn != null){
				AdministracionDAO.getInstancia().bajaDestinoNacional(dn);
		 	} else {
		 		Entity_DestinoInternacional di = AdministracionDAO.getInstancia().getDestinoInternacional(idDestino);
				if (di != null)
					AdministracionDAO.getInstancia().bajaDestinoInternacional(di);
		 	}
	}

	public DTO_Destino getDestinoNacional(Integer idDestino){
		return AdministracionDAO.getInstancia().getDestinoNacional(idDestino).toDTO();
	}
	public DTO_Destino getDestinoInternacional(Integer idDestino){
		return AdministracionDAO.getInstancia().getDestinoInternacional(idDestino).toDTO();
	}
	
	
	/*********************************************************************************************************************************/
	/**Usuario**/

	public void altaUsuario(DTO_Usuario usuario){
    	Entity_Empleado e = AdministracionDAO.getInstancia().getEmpleado(usuario.getIdEmpleado());
		Entity_Usuario u = new Entity_Usuario();
		u.setUsuario(usuario.getUsuario());
		u.setPassword(usuario.getPassword());
		u.setFechaCreacion(usuario.getFechaCreacion());
		u.setUltimoAcceso(usuario.getUltimoAcceso());
		
		if(usuario.getRoles() != null){
			List<Entity_Rol> roles = new ArrayList<Entity_Rol>();
    		for(DTO_Rol rol : usuario.getRoles()){
    			Entity_Rol r = AdministracionDAO.getInstancia().getRol(rol.getId());
    			roles.add(r);	
    		}
    		u.setRoles(roles);
    	}
		u.setEmpleado(e);
		AdministracionDAO.getInstancia().altaUsuario(u);
	}

	public void bajaUsuario(String usuario){
		Entity_Usuario u = AdministracionDAO.getInstancia().buscarUsuario(usuario);
		if (u!= null)
			AdministracionDAO.getInstancia().bajaUsuario(u);
	}
	public void ingresoUsuario(String usuario){
		Entity_Usuario u = AdministracionDAO.getInstancia().buscarUsuario(usuario);
		u.setUltimoAcceso(new Date());
		AdministracionDAO.getInstancia().actualizarUsuario(u);
	 }
	 public void cambiarPassword(String usuario, String oldPassword,String newPassword){
		 Entity_Usuario u = AdministracionDAO.getInstancia().buscarUsuario(usuario);
		 u.setPassword(newPassword);
		 List<Entity_Rol> roles = AdministracionDAO.getInstancia().buscarRolesUsuario(u.getUsuario());
		 u.setRoles(roles);
		 AdministracionDAO.getInstancia().actualizarUsuario(u);
	 }
	 public DTO_Usuario validarUsuario(String usuario, String password){
		 Entity_Usuario u = AdministracionDAO.getInstancia().buscarUsuario(usuario);
		 if (u.getPassword().equals(password))
			 return u.toDTO();
		 else
			 return null;
	 }

	
	 /*********************************************************************************************************************************/
	/**Listados**/
	//Paises
	 public List<DTO_Pais> listarPaises() {     
		 List<Entity_Pais> lista = AdministracionDAO.getInstancia().listarPaises();
		 List<DTO_Pais> listaDTO = new ArrayList<DTO_Pais>();
         for(Entity_Pais p: lista)
         	listaDTO.add(p.toDTO());
         
		 return listaDTO;
	}
	//Provincias
	 public List<DTO_Provincia> listarProvincias(String pais) {     
		 List<Entity_Provincia> lista = AdministracionDAO.getInstancia().listarProvincias(pais);
		 List<DTO_Provincia> listaDTO = new ArrayList<DTO_Provincia>();
         for(Entity_Provincia p: lista)
         	listaDTO.add(p.toDTO());
		 return listaDTO;
	}
	 //Roles
	 public List<DTO_Rol> listarRoles(){
		 List<Entity_Rol> lista = AdministracionDAO.getInstancia().listarRoles();
		 List<DTO_Rol> listaDTO = new ArrayList<DTO_Rol>();
         for(Entity_Rol p: lista)
         	listaDTO.add(p.toDTO());
         
		 return listaDTO;
	 }
	 public List<DTO_Rol> buscarRolesUsuario(String usuario){
		 List<Entity_Rol> roles = AdministracionDAO.getInstancia().buscarRolesUsuario(usuario);
		 List<DTO_Rol> dtoRoles = new ArrayList<DTO_Rol>();
	    	for(Entity_Rol rol : roles){
	    		DTO_Rol dto = new DTO_Rol();
	    		dto.setId(rol.getId());
	    		dto.setDescripcion(rol.getDescripcion());
	    		dtoRoles.add(dto);	    		
	    	}
		return dtoRoles;
	 }
	 public List<DTO_Empleado> listarEmpleados(){
		 List<Entity_Empleado> empleados = AdministracionDAO.getInstancia().listarEmpleados();
		 List<DTO_Empleado> empleadosDTO = new ArrayList<DTO_Empleado>();
	    for(Entity_Empleado empleado : empleados){
	    	empleadosDTO.add(empleado.toDTO());	    		
	    }
		return empleadosDTO;
	 }
	 public List<DTO_Empleado> listarEmpleados(Integer idSucursal){
		 List<Entity_Empleado> empleados = AdministracionDAO.getInstancia().listarEmpleados(idSucursal);
		 List<DTO_Empleado> empleadosDTO = new ArrayList<DTO_Empleado>();
	    for(Entity_Empleado empleado : empleados){
	    	empleadosDTO.add(empleado.toDTO());	    		
	    }
		return empleadosDTO;
	 }
	 public List<DTO_Sucursal> listarSucursales(){
		 List<Entity_Sucursal> sucursales = AdministracionDAO.getInstancia().listarSucursales();
		 List<DTO_Sucursal> sucursalesDTO = new ArrayList<DTO_Sucursal>();
		 for(Entity_Sucursal sucursal : sucursales){
	    	sucursalesDTO.add(sucursal.toDTO());	    		
	    }
		return sucursalesDTO;
	 }
	 public List<DTO_Stock> listarStock(){
		 List<Entity_Stock> sucursales = AdministracionDAO.getInstancia().listarStock();
		 List<DTO_Stock> stocksDTO = new ArrayList<DTO_Stock>();
		 for(Entity_Stock sucursal : sucursales){
			 stocksDTO.add(sucursal.toDTO());	    		
	    }
		return stocksDTO;
	 }
	 public List<DTO_Stock> listarStock(Integer idSucursal){
		 List<Entity_Stock> sucursales = AdministracionDAO.getInstancia().listarStock(idSucursal);
		 List<DTO_Stock> stocksDTO = new ArrayList<DTO_Stock>();
		 for(Entity_Stock sucursal : sucursales){
			 stocksDTO.add(sucursal.toDTO());	    		
	    }
		return stocksDTO;
	 }
	 public List<DTO_Destino> listarDestinoNacional(){
		 List<Entity_DestinoNacional> destinos = AdministracionDAO.getInstancia().listarDestinoNacional();
		 List<DTO_Destino> destinosDTO = new ArrayList<DTO_Destino>();
		 for(Entity_DestinoNacional destino : destinos){
			 destinosDTO.add((DTO_DestinoNacional) destino.toDTO());	    		
	    }
		return destinosDTO;
	 }
	 public List<DTO_Destino> listarDestinoNacional(Integer idSucursal){
		 List<Entity_DestinoNacional> destinos = AdministracionDAO.getInstancia().listarDestinoNacional(idSucursal);
		 List<DTO_Destino> destinosDTO = new ArrayList<DTO_Destino>();
		 for(Entity_DestinoNacional destino : destinos){
			 destinosDTO.add((DTO_DestinoNacional) destino.toDTO());	    		
	    }
		return destinosDTO;
	 }
	 public List<DTO_Destino> listarDestinoInternacional(){
		 List<Entity_DestinoInternacional> destinos = AdministracionDAO.getInstancia().listarDestinoInternacional();
		 List<DTO_Destino> destinosDTO = new ArrayList<DTO_Destino>();
		 for(Entity_DestinoInternacional destino : destinos){
			 destinosDTO.add((DTO_DestinoInternacional) destino.toDTO());	    		
	    }
		return destinosDTO;
	 }
	 public List<DTO_Destino> listarDestinoInternacional(Integer idSucursal){
		 List<Entity_DestinoInternacional> destinos = AdministracionDAO.getInstancia().listarDestinoInternacional(idSucursal);
		 List<DTO_Destino> destinosDTO = new ArrayList<DTO_Destino>();
		 for(Entity_DestinoInternacional destino : destinos){
			 destinosDTO.add((DTO_DestinoInternacional) destino.toDTO());	    		
	    }
		return destinosDTO;
	 }
	 public List<DTO_Usuario> listarUsuarios(){
		 List<Entity_Usuario> usuarios = AdministracionDAO.getInstancia().listarUsuarios();
		 List<DTO_Usuario> usuariosDTO = new ArrayList<DTO_Usuario>();
		 for(Entity_Usuario usuario : usuarios){
			 usuariosDTO.add(usuario.toDTO());	    		
	    }
		return usuariosDTO;
	 }
	 
	 
	 
	 
	 
	 
	 
	 
	 
	 
	 
	 
	 
	 
	 
	 

	 
    /*public DTO_Rol getRol(Integer id){
		 return AdministracionDAO.getInstancia().getRol(id).toDTO();
	 }*/

}
